仪器控制手册 您所在的位置:网站首页 Nationallnstruments VisaNS 仪器控制手册

仪器控制手册

2024-06-14 14:54| 来源: 网络整理| 查看: 265

仪器控制 概述前期准备VISA协议及辅助工具VISA协议辅助工具:NI-MAX SCPI指令仪器硬件驱动 仪器控制方法方法一:仪器硬件驱动步骤①:导入第三方库 sa_api.dll,直接放在Debug文件夹中步骤②:直接使用驱动提供的函数 方法二:(适用LAN口通讯)用户自定义通讯方法三:基于VISA协议步骤①:引用第三方库 NI-VISA库步骤②:确定仪器资源的名称步骤③:打开一个 VISA 会话步骤④:发送数据步骤⑤:关闭该 VISA 会话 方法④ :使用visa接口(`本方法博主并未使用过`)步骤①:将Visa32.dll文件放在工程的debug目录下面步骤②:引用Visa32.dll里面的函数,具体的使用方法请参考:NI-Visa help 说明

概述

仪器控制,就是计算机通过介质(网线、GPIB线等)完成对设备的控制,包括状态控制以及数据查询等

前期准备

需要了解VISA协议、SCPI指令、硬件驱动

VISA协议及辅助工具 VISA协议

VISA是一个驱动程序软件架构,开发这一架构的目的在于统一与GPIB、串口、以太网/LAN、IEEE 1394和USB仪器的通信,并简化仪器的控制应用。

VISA是NI-VISA(Virtual Instrument Software Architecture 虚拟仪器软件架构)的简称,是美国国家仪器 NI(National1nstrLlrnent)公司开发的一种用来与各种仪器总线进行通信的高级应用编程接口。

控制流程如下: 在这里插入图片描述

辅助工具:NI-MAX

安装NI-VISA(第三方库)后,安装一个软件,可以用来查看计算机连接的可使用设备资源。 NI-MAX 辅助软件NI-MAX,其实这个就是一个远程操作仪器的工具。 辅助软件NI-MAX 在这里插入图片描述 然后选择面板上的“打开VISA测试面板”,会打开如下所示的面板: 在这里插入图片描述 切换到Input/Output:就可以通过命令来获取仪表信息了,如下所示: 在这里插入图片描述

SCPI指令

SCPI (Standard Command for Programmable Instrumentation)程控仪器标准命令。 SCPI有公共的命令,即对所有的仪器都是可行的;也有特定的命令,即不同的仪器命令不同。但所有的命令都符合SCPI标准。

仪器硬件驱动

有的仪器厂商可能会自己基于VISA或者SCPI开发仪器的驱动,也就是往高层做了进一步封装,同时也是是对VISA和SCPI做了进一步封装,这样就进一步简化了开发流程。我们可以根据驱动说明或者仪器的编程说明使用仪器驱动软件架构。需要实现什么功能,调用相应的驱动API即可。还可以参考提供的样例。

仪器控制方法 方法一:仪器硬件驱动

例如:控制接收机SA44B,使用厂商提供的硬件驱动,signal_hound_sdk_11_02_20,提供的saOpenDevice()函数。 一个函数就集成了VISA中的若干步骤,实现连接硬件设备。

步骤①:导入第三方库 sa_api.dll,直接放在Debug文件夹中 步骤②:直接使用驱动提供的函数 Public Function saOpen() Try Dim openstatus As saStatus Dim status As Boolean = True openstatus = saOpenDevice(Id) If openstatus saStatus.saNoError Then saCloseDevice(Id) openstatus = saOpenDevice(Id) '将打开的设备的标识符赋值给Id End If If openstatus saStatus.saNoError Then MessageBox.Show("接收机连接失败!") errStatus = saGetErrorString(openstatus) status = False Return status Exit Function Else Return status End If Catch ex As Exception Console.WriteLine(errStatus) End Try End Function 方法二:(适用LAN口通讯)用户自定义通讯

用户建立TCP/IP连接,通过Socket实现设备连接。 我们需要实现一个TCP的客户端,通过仪器提供的IP地址和PORT端口号,我们的客户端同仪器进行TCP连接,连接完成后给仪器发送“仪器语言”,同时也会接受到仪器的响应。

Imports System.Net Imports System.Net.Sockets Dim SockClient As Socket Public Sub SwitchConnect(ByVal IP As String) Dim Address As IPAddress = IPAddress.Parse(IP) Dim Endpoint As New IPEndPoint(Address, CType(5555, Integer)) Try '捕获异常 SockClient.Connect(Endpoint) '发起连接。成功则返回值为0 Catch ss As SocketException MessageBox.Show(ss.Message) Catch s As Exception MessageBox.Show(s.Message) End Try End Sub 方法三:基于VISA协议 步骤①:引用第三方库 NI-VISA库

首先:添加库引用 将 NationalInstruments.Common 与 NationalInstruments.VisaNS 引用添加到您的项目。

NationalInstruments.Common 命名空间包括各种为许多 NI 驱动程序所使用的常见方法和属性。 NationalInstruments.VisaNS命名空间包括面向 VISA .Net API 的方法和属性

然后:将 VisaNS 命名空间导入到您的应用 这样可以减少方法前缀的使用,更直接地访问对象

[C#] using NationalInstruments.VisaNS; [VB .Net] Imports NationalInstruments.VisaNS 步骤②:确定仪器资源的名称

仪器资源名称,也称为仪器描述符,描述了VISA资源的准确名称和位置。 例如:

ASRL1::INSTR 描述了位于您的计算机的 COM 端口 1 的仪器 GPIB0::13::INSTR 描述了一个位于位置 13 的 GPIB 仪器

为了实现与一个使用 VISA 的仪器的通信,我们必须确定其地址和仪器描述符

步骤③:打开一个 VISA 会话

一个会话是自 VISA .Net API 到一项资源的一个连接或链接。

MessageBasedSession 类适用于通过发送和接收文本字符串形式的消息进行通信的仪器 RegisterBasedSession 类被用于与通过读写寄存器进行通信的仪器进行通信

本文面向的仪器是EMC领域的仪器,多为MessageBasedSession类

首先:声明一个新的 MessageBasedSession: [注]声明为全局变量,因为任何一个VISA函数都需要访问该变量

[C#] private MessageBasedSession mbSession; [VB .Net] Private mbSession As MessageBasedSession

然后:实例化一个MessageBasedSession对象 我们将使用静态方法(或者像在 Visual Basic 中那样称为共享方法)–ResourceManager 类的 GetLocalManager。该方法实例化一个新的 ResourceManager 对象。 这个新的 ResourceManager 对象包含一个名为 Open(打开)的函数,然后该函数实例化一个新的会话对象。最后,我们将新创建的会话对象映射到一个 MessageBasedSession

[C#] mbSession = (MessageBasedSession)ResourceManager.GetLocalManager().Open(resourceString.Text); [VB .Net] mbSession = CType(ResourceManager.GetLocalManager().Open(resourceString.Text), MessageBasedSession)

其中,resourceString.Text 就是前述的仪器描述符

(使用try catch来使代码更加健壮)

[C#] try {mbSession = (MessageBasedSession)ResourceManager.GetLocalManager().Open(resourceString.Text); } catch(InvalidCastException) { MessageBox.Show("Resource selected must be a message-based session"); } catch(Exception exp) { MessageBox.Show(exp.Message); } [VB .Net] Try mbSession = CType(ResourceManager.GetLocalManager().Open(resourceString.Text), MessageBasedSession) Catch exp As InvalidCastException MessageBox.Show("Resource selected must be a message-based session") Catch exp As Exception MessageBox.Show(exp.Message) End Try 步骤④:发送数据

在创建了一个与我们的仪器通信的会话之后,我们可以开始发送数据至该仪器,并读回其响应。 在于基于消息的仪器的通信中最为常用的三项操作为查询、写入和读取。

1.查询操作 : 将一个命令写入到一个仪器并读回其响应。 2.写入命令 : 仅发送一个命令至仪器。 3.读取命令 : 从仪器读取信息。

实例:查询操作

[C#] try { string responseString = mbSession.Query(stringToWrite.Text); } catch(Exception exp) { MessageBox.Show(exp.Message); } [VB .Net] Try Dim responseString As String = mbSession.Query(stringToWrite.Text) Catch exp As Exception MessageBox.Show(exp.Message End Try 步骤⑤:关闭该 VISA 会话

为了关闭我们创建的与我们仪器通信的 VISA 会话,我们必须使用 MessageBasedSession 类的 Dispose(处置)方法。该方法释放为该会话分配的所有资源。

[C#] mbSession.Dispose(); [VB .Net] mbSession.Dispose()

总结:NI-VISA 是一个面向多种仪器控制的快速且方便的解决方案。VISA .Net API 提供了一个面向对象的接口,以实现与您的仪器的方便通信。

方法④ :使用visa接口(本方法博主并未使用过) 步骤①:将Visa32.dll文件放在工程的debug目录下面 步骤②:引用Visa32.dll里面的函数,具体的使用方法请参考:NI-Visa help public bool Init(){ if (m_connect){ return m_connect; } viError = Visa32.viOpenDefaultRM(out m_viDefaultRM); if (viError != Visa32.VI_SUCCESS){ return false; } viError = Visa32.viOpen(m_viDefaultRM, resourceName, Visa32.VI_NO_LOCK, Visa32.VI_TMO_IMMEDIATE, out m_session); if (viError == Visa32.VI_SUCCESS){ m_connect = true; //clears spectrum清除寄存器 Visa32.viClear(m_session); viError = Visa32.viPrintf(m_session, "*CLS\n"); if (viError != Visa32.VI_SUCCESS){ m_connect = false; } System.Threading.Thread.Sleep(10); }else{ m_connect = false; } return m_connect; } 说明

后经查资料,方法③和④的区别是,托管与非托管程序集的区别。 方法③使用是.NET Framwork提供的托管程序集, NationalInstruments.Common 与 NationalInstruments.VisaNS,相当于内置的第三方库。适用于C#和VB.NET语言 方法④使用是非托管程序集,VISA32.dll,真正的第三方库。使用C++也可以进行开发 ,有博主实现,参考2

参考1:C#使用NI VISA实现程控仪器的自动化控制 参考2:C++ 基于VISA控制电源



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有